package com.kamistoat.meimeichat.meimeichatserverapplication.netty.service;

import com.kamistoat.meimeichat.meimeichatserverapplication.entity.*;
import com.kamistoat.meimeichatserveraggrement.protocol.friend.dto.UserDto;
import com.kamistoat.meimeichatserveraggrement.protocol.login.LoginResponse;
import com.kamistoat.meimeichatserveraggrement.protocol.login.dto.ChatTalkDto;
import com.kamistoat.meimeichatserveraggrement.protocol.login.dto.GroupsDto;
import com.kamistoat.meimeichatserveraggrement.protocol.login.dto.UserFriendDto;
import com.kamistoat.meimeichatserveraggrement.protocol.talk.TalkNoticeResponse;
import io.netty.channel.Channel;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 整个Netty的服务接口。通过该接口调用数据库原生接口
 */
public interface NettyUserService {
    /**
     * 获取 LoginResponse
     */
    LoginResponse getLoginResponse(Channel channel, MmcUserEntity selfUserEntity);

    /**
     * 根据UserId查询用户详情
     */
    MmcUserEntity queryUserInfo(String userId);

    /**
     * 根据Nickname查询用户详情
     */
    MmcUserEntity queryUserInfoByNickname(String userNickname);

    /**
     * 添加好友关系
     */
    void addUserFriend(ArrayList<MmcUserFriendEntity> userFriendList);

    /**
     * 删除对话框
     *
     * @param userId
     * @param talkId
     */
    void deleteUserTalk(String userId, String talkId);

    /**
     * 删除聊天记录
     *
     * @param userId
     * @param talkId
     */
    void deleteUserTalkRecord(String userId, String talkId);

    /**
     * 根据UserId查询其好友的详细信息.直接制作成用于网络间传输的Dto类
     *
     * @param userId
     * @return
     */
    List<UserFriendDto> queryUserFriendInfoList(String userId);

    /**
     * 根据UserId查询用户所在的群组List，直接制作成用于网络间传输的Dto类
     * 只返回没有退出的群组List
     *
     * @param userId
     * @return
     */
    List<GroupsDto> queryUserGroupsList(String userId);

    /**
     * 获取userid对应用户的聊天框
     *
     * @param userId
     * @return
     */
    List<MmcTalkBoxEntity> queryTalkBoxInfoList(String userId);

    /**
     * 添加聊天框
     * @param userId 发送者ID
     * @param friendUserId 接受者Id
     * @param talkType 类型 0-私聊 1-群聊
     */
    void addTalkBoxInfo(String userId, String friendUserId, Integer talkType);

    /**
     * 查询两个用户之间的聊天信息，双方发的都算，并按照时间进行排序
     *
     * @param userId
     * @param friendId
     * @return
     */
    List<MmcChatRecordEntity> queryUserFriendChatRecord(String userId, String friendId);

    /**
     * 查询一个群组中的所有聊天信息。
     */
    List<MmcChatRecordEntity> queryUserGroupChatRecord(String userId, String groupId);

    /**
     * 异步执行聊天消息入库
     * @return
     */
    CompletableFuture<Void> asyncAppendChatRecord(String userId, String talkId, String msgText, Date msgDate, Integer msgType, Integer talkTypeCode);

    /**
     * 异步执行聊天框入库
     * @return
     */
    CompletableFuture<Void> asyncAppendTalkBox(String userId, String talkId, Integer talkTypeCode);

    /**
     * 根据条件搜索好友，直接制作成UserDto
     * @param selfId
     * @param searchKey
     * @return
     */
    List<UserDto> querySearchFriendList(String selfId, String searchKey);
}
